﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using Caixa.Model;
using Caixa.BLL;
using Caixa.DB;
using System.Configuration;

namespace Binder
{
	/// <summary>
	/// WebService Binder para a comunicação entre os Bancos
	/// </summary>
	[WebService(Namespace = "http://tempuri.org/")]
	[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
	[System.ComponentModel.ToolboxItem(false)]
	// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
	// [System.Web.Script.Services.ScriptService]
	public class ServiceBinder : System.Web.Services.WebService
	{
		#region " Enum "

		private enum BancosValidosEnum
		{
			Invalido = 0,
			Bradesco = 237,
			Itau = 341
		}

		#endregion

		#region " DOC "

		[WebMethod]
		public bool ProcessaDOC(int numeroDOC, int numeroBancoRemetente, int numeroAgenciaRemetente, int numeroContaRemetente, int numeroBancoDestinatario, int numeroAgenciaDestinatario, int numeroContaDestinatario, double valor)
		{
			bool success = false;

			if (GetBancoValido(numeroBancoRemetente).Equals(BancosValidosEnum.Invalido))
				throw new Exception("Banco do remetente inválido!");

			if (GetBancoValido(numeroBancoDestinatario).Equals(BancosValidosEnum.Invalido))
				throw new Exception("Banco de destino inválido!");

			// Define o binder do banco do destinatario
			SetBinder(GetBancoValido(numeroBancoDestinatario));

			// Comunica com o banco do destinatário e gera a movimentação na respectiva conta
			Movimentacao movimentacao = ContaBLL.RecebeDOC(numeroDOC, numeroBancoRemetente, numeroAgenciaRemetente, numeroContaRemetente, numeroAgenciaDestinatario, numeroContaDestinatario, valor);
			success = (movimentacao != null);

			return success;
		}

		#endregion

		#region " TED "

		[WebMethod]
		public bool ProcessaTED(int numeroTED, int numeroBancoRemetente, int numeroAgenciaRemetente, int numeroContaRemetente, int numeroBancoDestinatario, int numeroAgenciaDestinatario, int numeroContaDestinatario, double valor)
		{
			bool success = false;

			if (GetBancoValido(numeroBancoRemetente).Equals(BancosValidosEnum.Invalido))
				throw new Exception("Banco do remetente inválido!");

			if (GetBancoValido(numeroBancoDestinatario).Equals(BancosValidosEnum.Invalido))
				throw new Exception("Banco de destino inválido!");

			// Define o binder do banco do destinatario
			SetBinder(GetBancoValido(numeroBancoDestinatario));

			// Comunica com o banco do destinatário e gera a movimentação na respectiva conta
			Movimentacao movimentacao = ContaBLL.RecebeTED(numeroTED, numeroBancoRemetente, numeroAgenciaRemetente, numeroContaRemetente, numeroAgenciaDestinatario, numeroContaDestinatario, valor);
			success = (movimentacao != null);

			return success;
		}

		#endregion

		#region " Binder "

		private BancosValidosEnum GetBancoValido(int numeroBanco)
		{
			BancosValidosEnum banco = BancosValidosEnum.Invalido;
			try
			{
				banco = (BancosValidosEnum)numeroBanco;
			}
			catch
			{
				banco = BancosValidosEnum.Invalido;
			}
			return banco;
		}

		private void SetBinder(BancosValidosEnum banco)
		{
			switch (banco)
			{
				case BancosValidosEnum.Bradesco:
					DAHelper.ConnectionStringBase = ConfigurationManager.ConnectionStrings["ConexaoBanco1"].ConnectionString;
					DAHelper.ProviderNameBase = ConfigurationManager.ConnectionStrings["ConexaoBanco1"].ProviderName;
					break;
				case BancosValidosEnum.Itau:
					DAHelper.ConnectionStringBase = ConfigurationManager.ConnectionStrings["ConexaoBanco2"].ConnectionString;
					DAHelper.ProviderNameBase = ConfigurationManager.ConnectionStrings["ConexaoBanco2"].ProviderName;
					break;
				case BancosValidosEnum.Invalido:
				default:
					break;
			}
		}

		#endregion
	}
}
